#include "Serializable.h"

#include <string.h>
#include <fan-llvm/core/Core.h>
#include "Type.h"
#include "UnsupportedErr.h"


Type* Serializable_classType = NULL;
VTable* Serializable_classVTable = NULL;


/**********************************************
 *
 * Methods and fields
 *
 **********************************************/


/* Void make(|Serializable->Void|? f) */
void Serializable_make_0(Serializable* self)
{
  exceptionThrow(UnsupportedErr_newWithFormattedMsg("sys::Serializable.make not implemented yet"));
}


/* Void make(|Serializable->Void|? f) */
void Serializable_make(Serializable* self, Func* f)
{
  exceptionThrow(UnsupportedErr_newWithFormattedMsg("sys::Serializable.make not implemented yet"));
}


/* Bool simple */
Bool Serializable_simple(Serializable* self)
{
  exceptionThrow(UnsupportedErr_newWithFormattedMsg("sys::Serializable.simple not implemented yet"));
}


/* Bool collection */
Bool Serializable_collection(Serializable* self)
{
  exceptionThrow(UnsupportedErr_newWithFormattedMsg("sys::Serializable.collection not implemented yet"));
}


/**********************************************
 *
 * Type-system functions
 *
 **********************************************/


Type* Serializable_initType(void)
{
  if (Serializable_classType == NULL)
  {
    Type* baseType = Obj_initType();
    VTable* vtable = Serializable_initVTable();
    Type* type = Type_new("Serializable", baseType, vtable, sizeof(Serializable), sizeof(SerializableVTable));
    Type_registerCtorImplementation(type, "make", Serializable_make_0, 0);
    Type_registerCtorImplementation(type, "make", Serializable_make, 1);
    Type_registerFieldImplementation(type, "collection", Serializable_collection, NULL);
    Type_registerFieldImplementation(type, "simple", Serializable_simple, NULL);
    Serializable_classType = type;
    Serializable_initStatic();
  }
  return Serializable_classType;
}


VTable* Serializable_initVTable(void)
{
  if (Serializable_classVTable == NULL)
  {
    VTable* vtable = memoryAlloc(sizeof(SerializableVTable));
    memcpy(vtable, Obj_initVTable(), sizeof(FanObjVTable));
    Serializable_classVTable = vtable;
  }
  return Serializable_classVTable;
}


void Serializable_initStatic(void)
{
}
